1、第几天
题目 第几天
思路分析
日期问题 组合拳
用nextday直到某天的判断技巧
cury == 2000:这个条件确保循环只在2000年内进行。一旦年份超过2000年,循环就会停止。
(curm < 5 || (curm == 5 && curd < 4)):这个条件分为两部分,用逻辑或||连接:
curm < 5:如果当前月份小于5(即1月到4月),条件为真,循环继续。
(curm == 5 && curd < 4):如果当前是5月,并且日期小于4日,则条件也为真,循环同样继续。
这个复合条件的意思是,只要没有达到2000年5月4日这一天,循环就会继续执行。当到达5月4日时,curm == 5 && curd < 4这一条件变为假,因为curd < 4不再成立,这时外层的curm < 5条件也不成立,因为已经是5月了,所以整个循环条件变为假,循环停止。
通用写法
while ((curYear < 给定年份) ||
(curYear == 给定年份 && curMonth < 给定月份) ||
(curYear == 给定年份 && curMonth == 给定月份 && curDay < 给定日子)) {
// 执行 nextday 操作
}
代码实现
#include<bits/stdc++.h>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int y){
return y%100 && y%4==0 || y%400==0;
}
int getdays(int y,int m){
return days[m]+(m==2 && is_leap(y));
}
void nextday(int &y,int &m,int &d){
d++;
if(d>getdays(y,m)){
d=1;
m++;
if(m>12){
m=1;
y++;
}
}
}
int main()
{
int cury=2000,curm=1,curd=1;
int cnt=1;
while(cury == 2000 && (curm < 5 || (curm == 5 && curd < 4))){
nextday(cury,curm,curd);
cnt++;
}
cout<<cnt;
return 0;
}
同类题型
视频讲解
⬅️ 第七届 c++ B组 省赛 🏠 00-刷题理模型 ➡️ 2、明码
💬 评论